package com.youuvs.exception;

import com.youuvs.enums.GlobalEnumCode;
import com.youuvs.result.JSONResult;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

// 全局统一异常注解，此注解下包含：ResponseBody+ControllerAdvice，方法返回值会封装为JSON
@RestControllerAdvice
//@RestControllerAdvice注解中有@Component注解,这里可不写
//@Component
// 日志器注解
@Slf4j
public class GlobalException {
    //次注解表示当前方法要捕捉的异常类型
    @ExceptionHandler(Exception.class)
    public JSONResult exceptionHandler(Exception e){
        e.printStackTrace();
        log.info("发生了exception异常:"+e.getMessage());
        return JSONResult.error(GlobalEnumCode.ERROR);

    }
    //此注解表示当前方法要捕捉的全局的业务异常,GlobalCustomException是自定义异常
    @ExceptionHandler(GlobalCustomException.class)
    public JSONResult exceptionGlobalHandler(GlobalCustomException e){
        e.printStackTrace();
        log.info("发生了GlobalCustomException异常:"+e.getErrorMessage()+"--"+e.getErrorCode());
        return JSONResult.error(e);
    }


    //此注解表示当前方法要捕捉的全局的参数异常
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public JSONResult methodArgumentNotValidException(MethodArgumentNotValidException e){
        e.printStackTrace();
        //打印日志
        log.info("发生了MethodArgumentNotValidException异常:"+e.getMessage());


        /*
        * 在e.printStackTrace();处打断点,e里面是含失败原因的
        * e.getBindingResult().getAllErrors(),拿到集合,
        * 集合中的DefaultMessage就是所需要的有效信息
        * */
        StringBuffer sbr = new StringBuffer();
        sbr.append("参数校验失败,失败原因为:");
        e.getBindingResult().getAllErrors().forEach(item->
            sbr.append(item.getDefaultMessage()).append(",")
        );

        return JSONResult.error(sbr.toString());
    }


}
